package com.itdachang.design.structural.proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author gcq
 * @Create 2022-02-11
 */
public class CglibProxy {
    /**
     * 为任意对象创建代理
     * @param t
     * @param <T>
     * @return
     */
    public static<T> T createProxy(T t) {
        // 1、创建一个增强器
        Enhancer enhancer = new Enhancer();
        /**
         * cglib 原理就是通过字节码的方式继承创建子类
         */
        // 2、设置要增强那个类的功能，增强器为这个类动态创建一个子类
        enhancer.setSuperclass(t.getClass());

        // 3、设置回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, // 方法对象
                                    Method method, // 为了能获取到原方法的一些元数据
                                    Object[] args, // 方法参数
                                    MethodProxy proxy // 方法代理
            ) throws Throwable {
                // 拦截前的逻辑
                System.out.println("cglib登场......xxx");

                // 获取原方法信息
//                method.getAnnotation()

                // 目标方法进行执行
                Object invoke = proxy.invokeSuper(obj, args);
                return invoke;
            }
        });
        // 创建代理对象
        Object o = enhancer.create();
        return (T)o;
    }
}